define([
        "dojo/_base/declare",
        "gistech/widgets/normalDialog/NormalDialog",
        "dojo/text!./templates/Template.html",
        "dojo/_base/lang",
        "dojo/dom-style",
        "dojo/dom-construct",
        "dojo/on","dojo/topic",
        "dojo/_base/connect",
        "gistech/util/ajaxUtil",
        "dojo/dom-style","dojo/query","dojo/dom-class"],
        function(declare,NormalDialog,template,lang,style,domConstruct,
        		on,topic,eventconnect,ajaxUtil,domStyle,query,domClass){
	return declare([NormalDialog],{
		templateString:template,
		projects:null,
		days:0,
		constructor:function (args) {
			this.inherited(arguments);
			this.map = args.map;
		},
		postCreate:function(){
			this.inherited(arguments);
		},
		startup:function(){
			this.inherited(arguments);    
			this.init();
			this.addEvents();
		},
		addEvents:function(){
			on(this.tongjiBtn, "click",lang.hitch(this,this.createProjectsPlanScheduleTable));//组织机构切换
		},
		init:function(){
			this.projects = [{projectname:"项目1",
				plannode:[
				          {nodeNm:"启动",nodeTm:"2015-8-1"},
				          {nodeNm:"村表决通过合作方案",nodeTm:"2015-12-10"},
				          {nodeNm:"提交收储申请",nodeTm:"2016-4-1"},
				          {nodeNm:"签订收储协议",nodeTm:"2016-8-31"},
				          {nodeNm:"土地挂牌",nodeTm:"2016-10-31"}
				          ],
				          realnode:[

				                    {nodeNm:"启动",nodeTm:"2015-8-1"},
				                    {nodeNm:"村表决通过合作方案",nodeTm:"2016-1-1"},
				                    {nodeNm:"提交收储申请",nodeTm:"2016-5-13"},
				                    {nodeNm:"签订收储协议",nodeTm:"2016-9-31"},
				                    {nodeNm:"土地挂牌",nodeTm:"2016-11-21"}
				                    ]
			},
			{projectname:"项目2",
				plannode:[
				          {nodeNm:"启动",nodeTm:"2016-2-1"},
				          {nodeNm:"村表决通过合作方案",nodeTm:"2016-5-1"},
				          {nodeNm:"提交收储申请",nodeTm:"2016-7-1"},
				          {nodeNm:"签订收储协议",nodeTm:"2016-10-31"},
				          {nodeNm:"土地挂牌",nodeTm:"2016-12-21"}
				          ],
				          realnode:[
				                    {nodeNm:"启动",nodeTm:"2016-2-1"},
				                    {nodeNm:"村表决通过合作方案",nodeTm:"2016-4-1"},
				                    {nodeNm:"提交收储申请",nodeTm:"2016-6-13"},
				                    {nodeNm:"签订收储协议",nodeTm:"2016-9-27"},
				                    {nodeNm:"土地挂牌",nodeTm:"2016-12-11"}
				                    ]
			},
			{projectname:"项目3",
				plannode:[
				          {nodeNm:"启动",nodeTm:"2015-5-1"},
				          {nodeNm:"村表决通过合作方案",nodeTm:"2015-8-1"},
				          {nodeNm:"提交收储申请",nodeTm:"2015-11-5"},
				          {nodeNm:"签订收储协议",nodeTm:"2016-3-25"},
				          {nodeNm:"土地挂牌",nodeTm:"2016-8-31"}
				          ],
				          realnode:[
				                    {nodeNm:"启动",nodeTm:"2015-5-1"},
				                    {nodeNm:"村表决通过合作方案",nodeTm:"2015-7-8"},
				                    {nodeNm:"提交收储申请",nodeTm:"2015-12-25"},
				                    {nodeNm:"签订收储协议",nodeTm:"2016-3-24"},
				                    {nodeNm:"土地挂牌",nodeTm:"2016-7-31"}
				                    ]
			}];
		},
		createProjectsPlanScheduleTable:function(){
			debugger;
			var table = dojo.query("#planScheduleTable").empty();
			this.days = DateDiff(dojo.byId("reportendtime").value,dojo.byId("reportstarttime").value)+1;//获取所选日期段的天数
			var beginDay = stringToData(dojo.byId("reportstarttime").value);
			var endDay = stringToData(dojo.byId("reportendtime").value);

			var yearDiff = endDay[0]-beginDay[0];//年份间隔
			var bMonth = beginDay[1];//选择日期开始月份
			var eMonth = endDay[1]+12*yearDiff;//选择日期结束月份
			var html = "";

			//占位符，不可删，删除则界面布局异常
			//--------------------------------------------------
			html+="<tr class='datarow'  ><td width='40px'></td>";
			var nowdate = formatDate(new Date(),"-"); //今天的日期，间隔符为“-”
			var nowdateposition= DateDiff(nowdate,dojo.byId("reportstarttime").value);//获取当前日期到所选起始日期的天数，以判断当前日期显示的位置
			for(var d=0;d<this.days;d++){
				html+=	"<td class='headertd'>";
				if(d==nowdateposition){//当绘制的占位符单元格到达当前日期时，显示当前日期竖线；如果当前日期在所选时间段之外则不画竖线
					html+= "<li class='cdate' style='height:"+(23.1*(this.projects.length*3+1))+"px;'></li><span style='margin-left: -28px;color: #f00'>"+nowdate+"</span>";
				}
				html+="</td>";
			}
			html+="</tr>";
			//----------------------------------------

			/**项目计划推进甘特图绘制
			 * 1、遍历所选时间段内的项目，每个项目占三行，第一行显示向下灰色箭头标注计划推进时间节点位置，中间行显示计划推进时间条，第三行显示向上绿色/橙色（节点与计划有延迟则用橙色）箭头标注实际推进节点位置
			 * 2、遍历一个项目的计划推进节点，绘制蓝色长条及上方的灰色箭头位置、节点时间
			 * 3、遍历一个项目的实际推进节点，绘制绘制蓝色长条下方的绿色/橙色箭头位置、节点时间
			 * 4、根据所选时间段按月绘制时间轴
			 */
			for(var i=0;i<this.projects.length;i++){
				var item=this.projects[i];

				var plannodes = item.plannode;
				html+="</tr><tr class='datarow' ><td class='projectnm'></td><td  colspan="+this.days+"></td>";//项目推进蓝色长条上方空白行
				var barLength = DateDiff(plannodes[0].nodeTm,dojo.byId("reportstarttime").value);//项目第一个计划节点（启动）与所选起始时间的距离，值可正可负

				html+="<tr class='datarow' ><td class='projectnm'>"+item.projectname+"</td>";//项目推进蓝色长条显示行
				//当计划启动节点在起始日期之后，则从起始日期到启动节点间需留白，并在留白结束位置显示启动节点日期及灰色箭头及字母A（注意项目的每个节点需依时间顺序排列，并依次以A-Z字母标记）
				//当计划启动节点在起始日期之前，则无需留白，并且将跳过所有在起始日期之前的计划节点的显示
				if(barLength>0){
					html+="<td class='bartd' style='    background-color: #fff;' colspan="+barLength+"><div class='planlabeldiv'><span>"+plannodes[0].nodeTm+"</span><div class='labelimg plan'> <span class='number'>A</span></div> </div></td>";
				}
				//遍历一个项目的所有计划节点，由于项目第一个节点（启动）已预先处理，故此时应从项目第二个计划节点开始判断
				for(var j=1;j<plannodes.length;j++){
					var isEnd = false;
					if(barLength<0){//当计划启动节点在起始日期之前，则无需留白，直接从当前tr的起始单元格开始绘制，直至下一个计划节点位置
						barLength = DateDiff(plannodes[j].nodeTm,dojo.byId("reportstarttime").value);
					}else{//从留白后的单元格开始绘制，长度为当前节点与前一个节点的日期差
						var endTm = plannodes[j].nodeTm;
						if(DateDiff(plannodes[j].nodeTm,dojo.byId("reportendtime").value)>0){//某一计划节点时间已超过所选终止日期，则仅绘制到所选终止日期位置，忽略超出部分
							endTm = dojo.byId("reportendtime").value;
							isEnd = true;//当前节点已超过所选终止日期，设置结束标志，后面的节点将不再绘制
						}
						barLength = DateDiff(endTm,plannodes[j-1].nodeTm);//蓝色长条长度
					}
					//节点时间超出所选终止日期，则不显示节点灰色向下箭头及节点字母
					var planlabel = isEnd?"":"<div class='planlabeldiv'><span>"+plannodes[j].nodeTm+"</span><div class='labelimg plan'> <span class='number' >"+getUpperWord(j)+"</span> </div><div>";
					if(barLength>0){//合并列数大于0才有合并的意义
						html+="<td class='bartd' style='    background-color: #60C2F1;' colspan="+barLength+">"+plannodes[j].nodeNm+planlabel+"</td>";
					}
					if(isEnd){//节点时间超出所选终止时间，退出循环
						break;
					}
				}
				//绘制实际节点的位置，与绘制计划甘特条类似，通过合并当前节点与前一节点直接的日期距离（区别是不填充颜色），并在合并结束的位置显示向上绿色/橙色箭头
				var realnodes = item.realnode;
				barLength = DateDiff(realnodes[0].nodeTm,dojo.byId("reportstarttime").value);//实际启动节点与所选起始时间的时间差，可正可负

				var isNotAfter = "realnormal";//样式名称，实际节点与计划节点间是否有延迟，默认无延迟
				html+="</tr><tr class='datarow' style='    border-bottom: 1px solid #e4e4e4;'><td class='projectnm'></td>";
				if(barLength>0){
					if(DateDiff(realnodes[0].nodeTm,plannodes[0].nodeTm)>0){
						isNotAfter = "realafter";
					}
					html+="<td  colspan="+barLength+"><div class='reallabeldiv'><span>"+realnodes[0].nodeTm+"</span><div class='labelimg "+isNotAfter+"'> <span class='number' >A</span> </div></td>";
				}
				for(var j=1;j<realnodes.length;j++){
					var isEnd = false;
					if(barLength<0){
						barLength = DateDiff(realnodes[j].nodeTm,dojo.byId("reportstarttime").value);
					}else{
						var endTm = realnodes[j].nodeTm;
						if(DateDiff(realnodes[j].nodeTm,dojo.byId("reportendtime").value)>0){
							endTm = dojo.byId("reportendtime").value;
							isEnd = true;
						}
						barLength = DateDiff(endTm,realnodes[j-1].nodeTm);
					}
					if(barLength>0){
						if(DateDiff(realnodes[j].nodeTm,plannodes[j].nodeTm)>0){
							isNotAfter = "realafter";
						}
						var reallabel = isEnd?"":"<div class='reallabeldiv'><span>"+realnodes[j].nodeTm+"</span><div class='labelimg "+isNotAfter+"'> <span class='number' >"+getUpperWord(j)+"</span> </div><div>";
						html+="<td  colspan="+barLength+">"+reallabel+"</td>";
					}
					if(isEnd){//节点时间超出所选终止时间，退出循环
						break;
					}
				}
				html+="</tr>";//<tr class='datarow' style='height: 15px;'><td width='40px'></td><td  colspan="+this.days+"></td>";
			}

			//时间轴
			html+="<tr class='datarow' '><td width='40px'></td>";
			for(var m=bMonth;m<eMonth;m++){//从起始月份开始绘制
				var year = beginDay[0]+(m==12?0:Math.floor(m/12)) ;
				var month = (m==12?m:m%12);
				var  day = new Date(year,month,0);   
				var lastdate = day.getDate();//获取当月最后一天日期 

				html+="<td class='datetd' colspan="+(lastdate-(m>bMonth?1:beginDay[2])+1)+">"+year + '/' + month+"</td>";
			}

			html+="<td class='datetd' colspan="+(endDay[2]-1-1)+">"+endDay[0] + '/' + endDay[1]+"</td></tr>";
			html=html.replace(/undefined/g,'');
			table.addContent(html);
		},
	});
});

